"""
多进程共享numpy数组，配合使用multiprocessing.Array和np.frombuffer，即可实现。
"""

"""
注意事项：

1. 如果要使用Pool类使用共享数据，则需要继承共享数据，即全局数据。
2. 如果需要显式传递它们，则必须使用multiprocessing.Process。

"""

import ctypes
import os
import multiprocessing
import numpy as np

NUM_PROCESS = multiprocessing.cpu_count()   # 查看支持线程数


def worker(index, data):
    main_nparray = np.frombuffer(data, dtype=ctypes.c_double)
    main_nparray = main_nparray.reshape(NUM_PROCESS, 10)
    pid = os.getpid()
    main_nparray[index, :] = pid



if __name__ == "__main__":
    shared_array_base = multiprocessing.Array(ctypes.c_double, NUM_PROCESS * 10, lock=False)    # 创建一个共享Array

    for i in range(NUM_PROCESS):
        p = multiprocessing.Process(target=worker, args=(i,shared_array_base, ))
        p.start()
        p.join()

    main_nparray = np.frombuffer(shared_array_base, dtype=ctypes.c_double)   # 将共享数据转为numpy格式
    main_nparray = main_nparray.reshape(NUM_PROCESS, 10)
    print(main_nparray)